package com.sjz.test1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import org.junit.Test;
/*
 * Java8 内置的四大核心函数式接口
 * 
 * Consumer<T> : 消费型接口
 * 		void accept(T t);
 * 
 * Supplier<T> : 供给型接口
 * 		T get(); 
 * 
 * Function<T, R> : 函数型接口
 * 		R apply(T t);
 * 
 * Predicate<T> : 断言型接口
 * 		boolean test(T t);
 * 
 */
public class TestLambda3 {
	
	 public void happy(double money, Consumer<Double> con){
			con.accept(money);
	 }
   
	 //Consumer<T> 消费型接口 :  有输入     没有输出结果
	@Test
	public void test1() {
		 happy(1000, (m)-> System.out.println("你们刚哥喜欢大宝剑，每次消费：" + m + "元") );
	}
	
    //需求：产生指定个数的整数，并放入集合中     第一个参数是循环的次数  第二个参数是每次得到的值 
	public List<Integer> getNumList(int num, Supplier<Integer> sup){
		List<Integer> list = new ArrayList<>();
		
		for (int i = 0; i < num; i++) {
			Integer n = sup.get();
			list.add(n);
		}
		
		return list;
	}
	
	
	//Supplier<T> 供给型接口 :   没有输入    只有输出
	@Test
	public void test2() {
	  List  result =	getNumList(3, ()->{
			return (int)(Math.random() * 100);
		});
	  
	  System.out.println(result);
	  System.out.println("*********************************************************");
	  List<Integer> numList = getNumList(10, () -> (int)(Math.random() * 100));
		
		for (Integer num : numList) {
			System.out.println(num);
		}
	}
	
	
	    //需求：用于处理字符串
		public String strHandler(String str, Function<String, String> fun){
			return fun.apply(str);
		}
		 
		//Function<T, R> 函数型接口：  有输入   有输出
		@Test
		public void test3() {
			String s=strHandler("abcdefg",(x)->x.substring(0, 2));
			System.out.println(s);
			 
		}
		
		
		//需求：将满足条件的字符串，放入集合中
		public List<String> filterStr(List<String> list, Predicate<String> pre){
			List<String> strList = new ArrayList<>();
			
			for (String str : list) {
				if(pre.test(str)){
					strList.add(str);
				}
			}
			
			return strList;
		}
	
		
		
		//断言型接口   有输入  有输出
		@Test
		public void test4() {
			List<String> list = Arrays.asList("Hello", "atguigu", "Lambda", "www", "ok");
			List result=filterStr(list, (x)->x.contains("a"));
			 System.out.println(result);
		}
	
	
	
	
}
